/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package edu.ucuenca.paginaasos.uimanager;

import edu.ucuenca.paginaasos.controller.GenericController;
import edu.ucuenca.paginaasos.entity.Cargo;
import edu.ucuenca.paginaasos.entity.Comentario;
import edu.ucuenca.paginaasos.entity.Escuela;
import edu.ucuenca.paginaasos.entity.Persona;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.el.ELContext;
import javax.el.ValueExpression;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import javax.imageio.ImageIO;
import org.primefaces.event.FileUploadEvent;

/**
 *
 * @author wilo
 */

@ManagedBean(name="GestorUsuarioEscuela")
@SessionScoped
public class GestorUsuarioEscuela {
    
    public static GestorUsuarioEscuela getInstance() {
        ELContext context = FacesContext.getCurrentInstance().getELContext();
        ValueExpression ex = FacesContext.getCurrentInstance().getApplication().getExpressionFactory().
                createValueExpression(context, "#{GestorUsuarioEscuela}", GestorUsuarioEscuela.class);
        return (GestorUsuarioEscuela) ex.getValue(context);
    }
    
    GenericController controller=new GenericController();
    Escuela escuela=new Escuela();
    
    private String titulo;
    private List<Persona> listusuario;
    private List<Persona> listusuarioBloqueados;
    private List<Comentario> listcomentario;
    private Persona persona;
    private List<Cargo> cargos;
    private Cargo cargoseleccionado;
    
    InputStream archivo;
    private String ext;
    
    private String razon;
    
    public GestorUsuarioEscuela() {
    }
    
    @PostConstruct
    public void init() {
        persona=new Persona();
        escuela=GestorUsuario.getInstance().getUsuarioActual().getPersona().getEscuela();
        cargarLista();
    }
    public void cargarLista() {
        listusuario = controller.findWhere(new Persona(), escuela);
        //cargos=controller.findWhere(new Cargo(), escuela);
    }
    public void cargarListaComentario(Persona persona, int tipo) {
        
        listcomentario=controller.findWhereComentarioUsuario(new Comentario(), persona.getUsuario(), tipo);
        if(tipo==1)
            this.titulo="COMENTARIOS REPORTADOS";
        else
            this.titulo="COMENTARIOS ELIMINADOS";
    }
    
    public void cargarListaUsuariosBloq ()
    {
        /*listusuarioBloqueados= controller.findWhere(new Persona(), escuela);
        listusuario=controller.findWhere(new Persona(), escuela);;
        listusuarioBloqueados.clear();
        for (int i=0; i<listusuario.size(); i++)
        {
            System.out.println("... "+listusuario.size());
            if (listusuario.get(i).getUsuario().getEstado()==1)
            {
                System.out.println("... "+listusuario.get(i).getApellidos());
               listusuarioBloqueados.add(listusuario.get(i));
            }
        }*/
    }
    public void bloquear()
    {
        try {
            System.out.println("llega a persona "+razon+", persona "+persona.getNombres());
            persona.setObservacion(razon);
            persona.getUsuario().setEstado(1);
            controller.edit(persona);
            controller.edit(persona.getUsuario());
        } catch (Exception ex) {
            //Logger.getLogger(GestorUsuarioEscuela.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
    public void SelecUsuario(Persona persona)
    {
        this.persona=new Persona();
        System.out.println("llega a persona  "+persona.getNombres());

        this.persona=persona;
    }
    
    public String guardar()
    {
        persona.setEscuela(escuela);
        controller.create(persona);
        return "";
    }
    
    public void upload(FileUploadEvent event) {
            FacesMessage msg = new FacesMessage("Success! ", event.getFile().getFileName() + " is uploaded.");  
            FacesContext.getCurrentInstance().addMessage(null, msg);
            try {
                setArchivo(event.getFile().getInputstream());
                ext = event.getFile().getFileName().substring(event.getFile().getFileName().length() - 3);
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

    public void copyFile(String destino, String fileName, InputStream in) {
        destino = destino + "/";
        try {   
            OutputStream out = new FileOutputStream(new File(destino + fileName));
            ImageIO.write(resize(in), "jpg", new File(destino + fileName));
            this.persona.setImagen(fileName);
            int read = 0;
            byte[] bytes = new byte[1024];

            while ((read = in.read(bytes)) != -1) {
                out.write(bytes, 0, read);
            }
            in.close();
            out.flush();
            out.close();
            
            System.out.println("New file created! " + destino + fileName);    
        } catch (IOException e) {
            System.out.println(e.getMessage());
        }
    }

    private BufferedImage resize(InputStream in) throws IOException {
        BufferedImage originalImage = ImageIO.read(in);
        int h = originalImage.getHeight();
        int w = originalImage.getWidth();
        int nuevoAncho = (w * 600) / h;
        int type = originalImage.getType() == 0 ? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
        if (h > 600 || w > 800) {
            BufferedImage resizeImageJpg = resizeImage(originalImage, type, nuevoAncho);
            return resizeImageJpg;
        } else {
            return originalImage;
        }
    }

    private static BufferedImage resizeImage(BufferedImage originalImage, int type, int ancho) {
        BufferedImage resizedImage = new BufferedImage(ancho, 600, type);
        Graphics2D g = resizedImage.createGraphics();
        g.drawImage(originalImage, 0, 0, ancho, 600, null);
        g.dispose();

        return resizedImage;
    }

    public InputStream getArchivo() {
        return archivo;
    }

    public void setArchivo(InputStream archivo) {
        this.archivo = archivo;
    }

    public String getRazon() {
        return razon;
    }

    public List<Cargo> getCargos() {
        return cargos;
    }

    public void setCargos(List<Cargo> cargos) {
        this.cargos = cargos;
    }

    public Cargo getCargoseleccionado() {
        return cargoseleccionado;
    }

    public void setCargoseleccionado(Cargo cargoseleccionado) {
        this.cargoseleccionado = cargoseleccionado;
    }

    public List<Persona> getListusuarioBloqueados() {
        return listusuarioBloqueados;
    }

    public void setListusuarioBloqueados(List<Persona> listusuarioBloqueados) {
        this.listusuarioBloqueados = listusuarioBloqueados;
    }

    public Persona getPersona() {
        return persona;
    }

    public void setPersona(Persona persona) {
        this.persona = persona;
    }

    public void setRazon(String razon) {
        this.razon = razon;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public List<Comentario> getListcomentario() {
        return listcomentario;
    }

    public void setListcomentario(List<Comentario> listcomentario) {
        this.listcomentario = listcomentario;
    }

    public Escuela getEscuela() {
        return escuela;
    }

    public void setEscuela(Escuela escuela) {
        this.escuela = escuela;
    }

    public List<Persona> getListusuario() {
        return listusuario;
    }

    public void setListusuario(List<Persona> listpersona) {
        this.listusuario = listpersona;
    }
    
    
}
